package sn.gandal.agriculture.agrimobile.j2me.businessObjects;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;

/**
 *
 * @author dysow
 */
public class Membre
{

    private int idRecord;
    private Date dateInscription;
    private int idAbonne;
    private String prenom;
    private String nom;
    private String prenomMere;
    private String nomMere;
    private String prenomPere;
    private String nomPere;
    private String telephone;
    private Date dateDeNaissance;
    private String poidsNaissance;
    private String sexe;
    private String nomPayeur;
    private String prenomPayeur;
    private long telephonePayeur;
    private int jourPesee1;
    private int jourPesee2;
    private int[] joursPesees;
    private boolean isModified = false;
    private boolean isActif = true;
    private Date dateDesabonnement = new Date();
    private int causeDesabonnement = 0;
    private Date dateDeces = new Date();
    private int causeDeces = 0;

    /**
     * Constructeur d'un abonn� vide
     */
    public Membre()
    {
    }

    public Membre(Date dateInscription, int idAbonne, String prenom, String nom, String prenomMere, String nomMere, String prenomPere,
	    String nomPere, String telephone, Date dateNaissance, String poidsNaissance, String sexe, String nomPayeur, String prenomPayeur,
	    long telephonePayeur, int jourPesee)
    {
	this.dateInscription = dateInscription;
	this.idAbonne = idAbonne;
	this.prenom = prenom;
	this.nom = nom;
	this.prenomMere = prenomMere;
	this.nomMere = nomMere;
	this.prenomPere = prenomPere;
	this.nomPere = nomPere;
	this.telephone = telephone;
	this.dateDeNaissance = dateNaissance;
	this.poidsNaissance = poidsNaissance;
	this.sexe = sexe;
	this.nomPayeur = nomPayeur;
	this.prenomPayeur = prenomPayeur;
	this.telephonePayeur = telephonePayeur;
	this.jourPesee1 = jourPesee;
	this.isActif = true;

    }

    public Membre(Date dateInscription, int idAbonne, String prenom, String nom, String prenomMere, String nomMere, String prenomPere,
	    String nomPere, String telephone, Date dateNaissance, String poidsNaissance, String sexe, String nomPayeur, String prenomPayeur,
	    int telephonePayeur, int[] jourPesees)
    {
	this.dateInscription = dateInscription;
	this.idAbonne = idAbonne;
	this.prenom = prenom;
	this.nom = nom;
	this.prenomMere = prenomMere;
	this.nomMere = nomMere;
	this.prenomMere = prenomMere;
	this.nomPere = nomPere;
	this.telephone = telephone;
	this.dateDeNaissance = dateNaissance;
	this.poidsNaissance = poidsNaissance;
	this.sexe = sexe;
	this.nomPayeur = nomPayeur;
	this.prenomPayeur = prenomPayeur;
	this.telephonePayeur = telephonePayeur;
	this.joursPesees = jourPesees;
	this.jourPesee1 = joursPesees[0];
	this.jourPesee2 = joursPesees[1];


    }

    public Membre(Date dateInscription, int idAbonneInt, String prenom, String nom, String prenomMere, String nomMere, String prenomPere,
	    String nomPere, String telephone, Date dateNaissance, String poidsNaissance, String sexe, String nomPayeur, String prenomPayeur,
	    long telephonePayeurLong)
    {
	this.dateInscription = dateInscription;
	this.idAbonne = idAbonneInt;
	this.prenom = prenom;
	this.nom = nom;
	this.prenomMere = prenomMere;
	this.nomMere = nomMere;
	this.prenomPere = prenomPere;
	this.nomPere = nomPere;
	this.telephone = telephone;
	this.dateDeNaissance = dateNaissance;
	this.poidsNaissance = poidsNaissance;
	this.sexe = sexe;
	this.nomPayeur = nomPayeur;
	this.prenomPayeur = prenomPayeur;
	this.telephonePayeur = telephonePayeurLong;

    }

    /**
     * 
     * @param dateInscription
     * @param idAbonne
     * @param prenom
     * @param nom
     * @param prenomMere
     * @param nomMere
     * @param prenomPere
     * @param nomPere
     * @param telephone
     * @param dateNaissance
     * @param poidsNaissance
     * @param sexe
     * @param nomPayeur
     * @param prenomPayeur
     * @param telephonePayeur
     * @param joursDePesee1
     * @param joursDePesee2
     */
    public Membre(Date dateInscription, int idAbonne, String prenom, String nom, String prenomMere, String nomMere, String prenomPere,
	    String nomPere, String telephone, Date dateNaissance, String poidsNaissance, String sexe, String nomPayeur, String prenomPayeur,
	    long telephonePayeur, int joursDePesee1, int joursDePesee2)
    {
	this.dateInscription = dateInscription;
	this.idAbonne = idAbonne;
	this.prenom = prenom;
	this.nom = nom;
	this.prenomMere = prenomMere;
	this.nomMere = nomMere;
	this.prenomPere = prenomPere;
	this.nomPere = nomPere;
	this.telephone = telephone;
	this.dateDeNaissance = dateNaissance;
	this.poidsNaissance = poidsNaissance;
	this.sexe = sexe;
	this.nomPayeur = nomPayeur;
	this.prenomPayeur = prenomPayeur;
	this.telephonePayeur = telephonePayeur;
	this.jourPesee1 = joursDePesee1;
	this.jourPesee2 = joursDePesee2;

    }



    /**
     * 
     *  
     */
    public Membre(Date dateInscription, int idAbonne, String prenom, String nom, String prenomMere, String nomMere, String prenomPere,
	    String nomPere, String telephone, Date dateNaissance, String poidsNaissance, String sexe, String nomPayeur, String prenomPayeur,
	    long telephonePayeur, int joursDePesee1, int joursDePesee2, int idCauseDesabonnement, Date dateDesabonnement)
    {
	this.dateInscription = dateInscription;
	this.idAbonne = idAbonne;
	this.prenom = prenom;
	this.nom = nom;
	this.prenomMere = prenomMere;
	this.nomMere = nomMere;
	this.prenomPere = prenomPere;
	this.nomPere = nomPere;
	this.telephone = telephone;
	this.dateDeNaissance = dateNaissance;
	this.poidsNaissance = poidsNaissance;
	this.sexe = sexe;
	this.nomPayeur = nomPayeur;
	this.prenomPayeur = prenomPayeur;
	this.telephonePayeur = telephonePayeur;
	this.jourPesee1 = joursDePesee1;
	this.jourPesee2 = joursDePesee2;
	this.causeDesabonnement = idCauseDesabonnement;
	this.dateDesabonnement = dateDesabonnement;
	//this.isActif = false;

    }



    /**
     * Contient deces
     */
    public Membre(Date dateInscription, int idAbonne, String prenom, String nom, String prenomMere, String nomMere, String prenomPere,
	    String nomPere, String telephone, Date dateNaissance, String poidsNaissance, String sexe, String nomPayeur, String prenomPayeur,
	    long telephonePayeur, int joursDePesee1, int joursDePesee2, Date dateDeces, int idCauseDeces)
    {
	this.dateInscription = dateInscription;
	this.idAbonne = idAbonne;
	this.prenom = prenom;
	this.nom = nom;
	this.prenomMere = prenomMere;
	this.nomMere = nomMere;
	this.prenomPere = prenomPere;
	this.nomPere = nomPere;
	this.telephone = telephone;
	this.dateDeNaissance = dateNaissance;
	this.poidsNaissance = poidsNaissance;
	this.sexe = sexe;
	this.nomPayeur = nomPayeur;
	this.prenomPayeur = prenomPayeur;
	this.telephonePayeur = telephonePayeur;
	this.jourPesee1 = joursDePesee1;
	this.jourPesee2 = joursDePesee2;
	this.dateDeces = dateDeces;
	this.causeDeces = idCauseDeces;
	//this.isActif = false;
    }

    /**
     * @return the idRecord
     */
    public int getIdRecord()
    {
	return idRecord;
    }

    /**
     * @param idRecord the idRecord to set
     */
    public void setIdRecord(int idRecord)
    {
	this.idRecord = idRecord;
    }

    /**
     * @return the dateInscription
     */
    public Date getDateInscription()
    {
	return dateInscription;
    }

    /**
     * @param dateInscription the dateInscription to set
     */
    public void setDateInscription(Date dateInscription)
    {
	this.dateInscription = dateInscription;
    }

    /**
     * @return the idAbonne
     */
    public int getIdAbonne()
    {
	return idAbonne;
    }

    /**
     * @param idAbonne the idAbonne to set
     */
    public void setIdAbonne(int idAbonne)
    {
	this.idAbonne = idAbonne;
    }

    /**
     * @return the prenom
     */
    public String getPrenom()
    {
	return prenom;
    }

    /**
     * @param prenom the prenom to set
     */
    public void setPrenom(String prenom)
    {
	this.prenom = prenom;
    }

    /**
     * @return the nom
     */
    public String getNom()
    {
	return nom;
    }

    /**
     * @param nom the nom to set
     */
    public void setNom(String nom)
    {
	this.nom = nom;
    }

    /**
     * @return the prenomMere
     */
    public String getPrenomMere()
    {
	return prenomMere;
    }

    /**
     * @param prenomMere the prenomMere to set
     */
    public void setPrenomMere(String prenomMere)
    {
	this.prenomMere = prenomMere;
    }

    /**
     * @return the nomMere
     */
    public String getNomMere()
    {
	return nomMere;
    }

    /**
     * @param nomMere the nomMere to set
     */
    public void setNomMere(String nomMere)
    {
	this.nomMere = nomMere;
    }

    /**
     * @return the prenomPere
     */
    public String getPrenomPere()
    {
	return prenomPere;
    }

    public int getJourPesee1()
    {
	return jourPesee1;
    }

    public int[] getJoursPesees()
    {
	return joursPesees;
    }

    public void setIsActif(boolean isActif)
    {
	this.isActif = isActif;
    }

    public void setIsModified(boolean isModified)
    {
	this.isModified = isModified;
    }

    /**
     * @param prenomPere the prenomPere to set
     */
    public void setPrenomPere(String prenomPere)
    {
	this.prenomPere = prenomPere;
    }

    /**
     * @param nomPere the nomPere to set
     */
    public void setNomPere(String nomPere)
    {
	this.nomPere = nomPere;
    }

    /**
     * @return the nomPere
     */
    public String getNomPere()
    {
	return nomPere;
    }

    /**
     * @return the telephone
     */
    public String getTelephone()
    {
	return telephone;
    }

    /**
     * @param telephone the telephone to set
     */
    public void setTelephone(String telephone)
    {
	this.telephone = telephone;
    }

    /**
     * @return the dateDeNaissance
     */
    public Date getDateDeNaissance()
    {
	return dateDeNaissance;
    }

    /**
     * @param dateDeNaissance the dateDeNaissance to set
     */
    public void setDateDeNaissance(Date dateDeNaissance)
    {
	this.dateDeNaissance = dateDeNaissance;
    }

    /**
     * @return the poidsNaissance
     */
    public String getPoidsNaissance()
    {
	return poidsNaissance;
    }

    /**
     * @param poidsNaissance the poidsNaissance to set
     */
    public void setPoidsNaissance(String poidsNaissance)
    {
	this.poidsNaissance = poidsNaissance;
    }

    /**
     * @return the sexe
     */
    public String getSexe()
    {
	return sexe;
    }

    /**
     * @param sexe the sexe to set
     */
    public void setSexe(String sexe)
    {
	this.sexe = sexe;
    }

    /**
     * @return the nomPayeur
     */
    public String getNomPayeur()
    {
	return nomPayeur;
    }

    /**
     * @param nomPayeur the nomPayeur to set
     */
    public void setNomPayeur(String nomPayeur)
    {
	this.nomPayeur = nomPayeur;
    }

    /**
     * @return the prenomPayeur
     */
    public String getPrenomPayeur()
    {
	return prenomPayeur;
    }

    /**
     * @param prenomPayeur the prenomPayeur to set
     */
    public void setPrenomPayeur(String prenomPayeur)
    {
	this.prenomPayeur = prenomPayeur;
    }

    /**
     * @return the telephonePayeur
     */
    public long getTelephonePayeur()
    {
	return telephonePayeur;
    }

    public int getJourPesee2()
    {
	return jourPesee2;
    }

    public void setJourPesee2(int jourPesee2)
    {
	this.jourPesee2 = jourPesee2;
    }

    /**
     * @param telephonePayeur the telephonePayeur to set
     */
    public void setTelephonePayeur(long telephonePayeur)
    {
	this.telephonePayeur = telephonePayeur;
    }

    public int getJourPesee()
    {
	return jourPesee1;
    }

    /**
     * @param joursDePesees the joursDePesees to set
     */
    public void setJourPesee(int jourPesee)
    {
	this.jourPesee1 = jourPesee;
    }

    public boolean isModified()
    {
	return this.isModified;
    }

    public boolean isActif()
    {
	return this.isActif;
    }

    public void setModified(boolean bool)
    {
	this.isModified = bool;
    }

    public void setActif(boolean bool)
    {
	this.isActif = bool;
    }

    public Date getDateDesabonnement()
    {
	return this.dateDesabonnement;
    }

    public void setDateDesabonnement(Date dateDesabonnement)
    {
	this.dateDesabonnement = dateDesabonnement;
    }

    public int getCauseDesabonnement()
    {
	return this.causeDesabonnement;
    }

    public void setIdCauseDesabonnement(int idCauseDesabonnement)
    {
	this.causeDesabonnement = idCauseDesabonnement;
    }

    public Date getDateDeces()
    {
	return this.dateDeces;
    }

    public void setDateDeces(Date dateDeces)
    {
	this.dateDeces = dateDeces;
    }

    public int getCauseDeces()
    {
	return this.causeDeces;
    }

    public void setIdCauseDeces(int idCauseDeces)
    {
	this.causeDeces = idCauseDeces;
    }

    /**
     * Methode pour la serialization de la classe
     * @return byteArray - byte []
     */
    public byte[] serialize() throws IOException
    {
	ByteArrayOutputStream bout = new ByteArrayOutputStream();
	DataOutputStream dout = new DataOutputStream(bout);

	dout.writeInt(idAbonne);
	dout.writeUTF(nom);
	dout.writeUTF(prenom);
	dout.writeUTF(nomMere);
	dout.writeUTF(prenomMere);
	dout.writeLong(dateDeNaissance.getTime());
	dout.writeUTF(sexe);
	dout.writeUTF(prenomPere);
	dout.writeUTF(nomPere);
	dout.writeUTF(poidsNaissance);
	dout.writeUTF(telephone);
	dout.writeLong(dateInscription.getTime());
	dout.writeUTF(nomPayeur);
	dout.writeUTF(prenomPayeur);
	dout.writeLong(telephonePayeur);

	dout.writeInt(jourPesee1);
	dout.writeInt(jourPesee2);

	//ADD
	dout.writeLong(dateDesabonnement.getTime());
	dout.writeInt(causeDesabonnement);
	dout.writeLong(dateDeces.getTime());
	dout.writeInt(causeDeces);
	//END

	dout.writeBoolean(this.isModified);

	dout.writeBoolean(this.isActif);//ADD

	dout.flush();
	dout.close();
	bout.close();

	return bout.toByteArray();
    }

    /**
     * Methode pour deserializer un objet de type Abonnes
     */
    public void deSerialize(byte[] data) throws IOException
    {
	ByteArrayInputStream bin = new ByteArrayInputStream(data);
	DataInputStream din = new DataInputStream(bin);

	idAbonne = din.readInt();
	nom = din.readUTF();
	prenom = din.readUTF();
	nomMere = din.readUTF();
	prenomMere = din.readUTF();
	dateDeNaissance = new Date(din.readLong());
	sexe = din.readUTF();
	prenomPere = din.readUTF();
	nomPere = din.readUTF();
	poidsNaissance = din.readUTF();
	telephone = din.readUTF();
	dateInscription = new Date(din.readLong());
	nomPayeur = din.readUTF();
	prenomPayeur = din.readUTF();
	telephonePayeur = din.readLong();

	jourPesee1 = din.readInt();
	jourPesee2 = din.readInt();

	//ADD
	dateDesabonnement = new Date(din.readLong());
	causeDesabonnement = din.readInt();
	dateDeces = new Date(din.readLong());
	causeDeces = din.readInt();
	//END

	this.isModified = din.readBoolean();

	this.isActif = din.readBoolean();//ADD

	din.close();
	bin.close();
    }

    public String validerDetailsAbonne()
    {
	String error = "";

	error += this.validateDateNaissance();

	if (this.dateInscription == null)
	{
	    error += "\n- Date d'inscription obligatoire";
	}

	if (this.prenom.equals(""))
	{
	    error += "\n- Prenom Abonné obligatoire";
	}

	if (this.nom.equals(""))
	{
	    error += "\n- Nom Abonné obligatoire";
	}

	if (this.prenomMere.equals(""))
	{
	    error += "\n- Prenom de la mère obligatoire";
	}

	if (this.nomMere.equals(""))
	{
	    error += "\n- Nom de la mère obligatoire";
	}

	if (this.dateDeNaissance == null)
	{
	    error += "\n- Date naissance obligatoire";
	}

	if (this.poidsNaissance.equals(""))
	{
	    error += "\n- Poids à la naissance obligatoire";
	}

	if (this.sexe.equals(""))
	{
	    error += "\n- Sexe obligatoire";
	}

	if (this.nomPayeur.equals(""))
	{
	    error += "\n- Nom du payeur obligatoire";
	}

	if (this.prenomPayeur.equals(""))
	{
	    error += "\n- Prenom du payeur obligatoire";
	}

	if (!this.poidsNaissance.equals(""))
	{
	    //if (Integer.parseInt(this.poidsNaissance) < 0)
	    if (this.poidsNaissance.startsWith("-"))
	    {
		error += "\n- Poids ne peut pas être négative";
	    }
	}

	if (this.telephonePayeur < 0)
	{
	    error += "\n- Téléphone du payeur doit avoir des numéros positive";
	}

	return error;
    }

    private String validateDateNaissance()
    {
	String error = "";

	Calendar birthcal = Calendar.getInstance();

	if (this.dateDeNaissance != null)
	{
	    birthcal.setTime(this.dateDeNaissance);
	}

	Calendar calDateNaissance = Calendar.getInstance();

	if (this.dateDeNaissance != null)
	{
	    calDateNaissance.setTime(this.dateDeNaissance);
	}

	Date dateActuelle = new Date();
	Calendar calDateActuelle = Calendar.getInstance();
	calDateActuelle.setTime(dateActuelle);

	calDateNaissance.set(Calendar.YEAR, calDateNaissance.get(Calendar.YEAR) + 1);

	if (birthcal.after(calDateActuelle))
	{
	    error += "\n- La date de naissance n'est pas valide";
	}
	return error;

    }

    /**
     * Valider le jour de passage(coché pas ADP) selon la date de naissance
     * @return
     */
    public String validateDates()
    {
	String error = "";

	Calendar calDateNaissance = Calendar.getInstance();

	if (this.dateDeNaissance != null)
	{
	    calDateNaissance.setTime(this.dateDeNaissance);
	}

	Date dateActuelle = new Date();
	Calendar calDateActuelle = Calendar.getInstance();
	calDateActuelle.setTime(dateActuelle);

	calDateNaissance.set(Calendar.YEAR, calDateNaissance.get(Calendar.YEAR) + 1);

	if (calDateNaissance.after(calDateActuelle))//l'enfant a moins d'un ans
	{
	    if ((this.jourPesee1 < 0) && (this.jourPesee2 < 0))
	    {
		error += "Vous devez cocher le jour de passage";
	    }
	    else if (this.jourPesee2 < 0)
	    {
		error += "Vous avez mal coché le jour de passage car l'enfant a moins d'un an";
	    }
	}
	else
	{

	    if (this.jourPesee2 > 0)
	    {
		error += "Vous avez mal coché le jour de passage car l'enfant a plus d'un an";

	    }
	}

	return error;
    }

    public Membre(int abonneId, String prenom, String nom, String prenomMere, String nomMere)
    {
	this.idAbonne = abonneId;
	this.prenom = prenom;
	this.nom = nom;
	this.prenomMere = prenomMere;
	this.nomMere = nomMere;
    }

    public String validerRechercheAbonne()
    {
	String error = "";

	if ((this.idAbonne < 0) && (this.nom.equals("")) && (this.prenom.equals("")) && (this.nomMere.equals("")) && (this.prenomMere.equals(
		"")))
	{
	    error += "\n- Aucun critère de recherche\n- Vous devez remplir au moins un champ";
	}

	if (this.idAbonne > 0)
	{
	    if ((Integer.toString(this.idAbonne).length()) < 8)
	    {

		error += "\n- Identifiant Abonné doit comprendre de 8 chiffres";
	    }
	}

	return error;
    }

    // afficher IdentifiantAbonne suivi de prenom
    public String getDisplay()
    {
	return this.idAbonne + " " + this.prenom;
    }

    public String validerChampsAbonne(String telephonePayeur, String telephone)
    {
	String error = "";

	if (telephonePayeur.length() == 0)
	{
	    error += "\n- Vous devez remplir les champs";
	}
	else if (!telephone.equals(""))
	{
	    //if (Integer.parseInt(telephone) < 0)
	    if (Long.parseLong(telephone) < 0)
	    {
		error += "\n- Téléphone doit avoir des numéros positifs";
	    }

	}

	return error;
    }

    public String validerChampsEditAbonne(String telephonePayeur, String telephone)
    {
	String error = "";
	
	char[] valid = new char[]{'1', '2','3','4','5','6','7','8','9','0','-',' '};

	if (telephonePayeur.length() == 0)
	{
	    error += "\n- Vous devez remplir les champs";
	}
	else if (!telephone.equals(""))
	{
	    for (int i = 0;i < telephone.length();i++)
	    {
		char c = telephone.charAt(i);
		if (!Character.isDigit(c))
		{
		    char charVar = '-';
		    char space = ' ';

		    if ((c != charVar) && (c != space))
		    {
			error = "\n- Téléphone ne doit pas contenir des charactère";			
		    }
		}
	    }
	}

	return error;
    }

    public String toString()
    {
	return "ID     : " + getIdAbonne() + " \n PRENOM : " + getPrenom() + " \n NOM    : " + getNom();
    }
}
